import type { PlasmoMessaging } from "@plasmohq/messaging"
import { Storage } from "@plasmohq/storage"

import ApiList from "~utils/apis"

const storage = new Storage()
// 登录成功信息
type LoginInfo = {
  // 登陆token
  authorization: string
  // 用户头像
  avatar: string
  // 用户id
  id: number
  // 用户名
  name: string
  // 登录账号
  username: string
  // 所属店铺
  prefix: { id: number; name: string; src: string }
  // 工作店铺(扫码登录)
  actionshop: { id: number; name: string }
  // 工作店铺(密码登录)
  workprefix: { id: number; name: string; src: string }
}
/**
 * 登陆服务
 * 接收信息{loginTmpCode: string}
 * 通过loginTmpCode构造跳转地址，跳转地址自动返回前端登陆接口获取登陆信息
 * 将登陆信息保存到storage中
 * 不返回信息
 */

/**
 * 保存登陆信息
 * @param loginInfo
 * @param errMsg
 */
const saveLoginInfo = async (
  loginInfo: LoginInfo,
  errMsg: string | undefined
) => {
  // 如果errMsg为非空，说明登陆失败
  // 清空storage中的登陆信息
  await storage.set("loginInfo", {})
  // 记录登陆状态为false
  await storage.set("isLogin", false)
  if (errMsg) {
    // 记录错误信息
    await storage.set("loginErr", errMsg)
  } else {
    try {
      // 如果errMsg为空，说明登陆成功
      // 将自定信息保存到storage中
      await storage.set("loginInfo", loginInfo)
      // 记录登陆状态为true
      await storage.set("isLogin", true)
      // 清空错误信息
      await storage.set("loginErr", "")
    } catch (e) {
      console.log(e)
      // 记录错误信息
      await storage.set("loginErr", "登陆信息保存失败")
    }
  }
}

/**
 * loginService-登陆服务
 * @param req
 * @param res
 */
const handler: PlasmoMessaging.MessageHandler = async (req, res) => {
  // 通过type判断登陆类型 1: 扫码登陆 2: 密码登陆
  const loginTypes = {
    qr: 1,
    password: 2
  }
  const { loginTmpCode, type, username, password } = req.body
  if (type === loginTypes.qr) {
    // 如果loginTmpCode不存在，返回错误
    if (!loginTmpCode) {
      // 记录登陆状态为false
      await saveLoginInfo({} as LoginInfo, "loginTmpCode is not exist")
    } else {
      try {
        // 如果loginTmpCode存在
        // 构建跳转地址
        const appid = "dingj2boitttylsscgyd"
        // redirect_uri不需要填写，真正的跳转地址是在再扫码构造请求定义
        const requestUrl = `https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=${appid}&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=&loginTmpCode=${loginTmpCode}`
        // 发送请求
        const response = await fetch(requestUrl, {
          method: "GET"
        })
        const { code, data } = await response.json()
        if (code !== 200) {
          // 如果code不为200，登陆失败
          await saveLoginInfo({} as LoginInfo, "login failed through web api")
        } else {
          // 如果code为200
          // 判断是否有登录信息
          if (!data) {
            // 如果没有登陆信息，登陆失败
            // await saveLoginInfo({}, "login failed through web api")
            await saveLoginInfo({} as LoginInfo, "扫码登陆失败,请联系绑定钉钉!")
          } else {
            // 将登陆信息保存到storage中
            await saveLoginInfo(data, "")
          }
        }
      } catch (e) {
        // 如果请求失败，登陆失败
        await saveLoginInfo({} as LoginInfo, e)
      }
    }
  } else if (type === loginTypes.password) {
    const loginRes = await ApiList.login({ username, password })
    // loginRes类型转为LoginInfo类型
    const data = loginRes.data as LoginInfo
    if (data.authorization) {
      // 将登陆信息保存到storage中
      await saveLoginInfo(data, "")
    } else {
      await saveLoginInfo({} as LoginInfo, "账号或密码错误！")
    }
  }
  // 返回空信息
  res.send({})
}

export default handler
